---
title: Manual Docker Setup
description: Detailed installation instructions for Docker
---

You can install <span class="-tracking-[0.075em]">wanderer</span> components either via Docker ([Quick Setup](./quick) or [Manual Setup](./docker)) or [from source](./installation-from-source).

## Prerequisites

<span class="-tracking-[0.075em]">wanderer</span> uses encrypted secrets such as passwords and private keys. To support this, you must set an encryption key using the `POCKETBASE_ENCRYPTION_KEY` [environment variable](/run/environment-configuration#pocketbase). You can generate one using:

```bash
openssl rand -hex 16
# Example output: ce7f0ddb97100c42e6409a8537c11e23
```

:::caution
Do not share this key with anyone!
:::

Once you have set the encryption key, you can proceed to install <span class="-tracking-[0.075em]">wanderer</span>.

## Start

After cloning the repository, you will find a [`docker-compose.yml`](https://github.com/Flomp/wanderer/blob/main/docker-compose.yml) file in the root directory. This file sets up all necessary components. Start everything by running:

```bash
docker compose up -d
```

## Configuration Notes

If you're not hosting <span class="-tracking-[0.075em]">wanderer</span> at `http://localhost:3000`, update the `ORIGIN` environment variable accordingly:

```env
ORIGIN=http(s)://<your_domain>:<your_port>
```

If this is not set correctly, you may encounter CORS-related issues.

## Docker Compose Overview

Here's a minimal `docker-compose.yml` example with explanations:

```yaml
version: '3'

x-common-env: &cenv
  MEILI_URL: http://search:7700
  MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo

services:
  search:
    container_name: wanderer-search
    image: getmeili/meilisearch:v1.11.3
    environment:
      <<: *cenv
      MEILI_NO_ANALYTICS: "true"
    ports:
      - 7700:7700
    networks:
      - wanderer
    volumes:
      - ./data/data.ms:/meili_data/data.ms
    restart: unless-stopped
    healthcheck:
      test: curl --fail http://localhost:7700/health || exit 1
      interval: 15s
      retries: 10
      start_period: 20s
      timeout: 10s

  db:
    container_name: wanderer-db
    image: flomp/wanderer-db
    depends_on:
      search:
        condition: service_healthy
    environment:
      <<: *cenv
      POCKETBASE_ENCRYPTION_KEY: <YOUR_ENCRYPTION_KEY_HERE>
      ORIGIN: http://localhost:3000
    ports:
      - "8090:8090"
    networks:
      - wanderer
    restart: unless-stopped
    volumes:
      - ./data/pb_data:/pb_data
    healthcheck:
      test: wget --spider -q http://localhost:8090/health || exit 1
      interval: 15s
      retries: 10
      start_period: 20s
      timeout: 10s

  web:
    container_name: wanderer-web
    image: flomp/wanderer-web
    depends_on:
      search:
        condition: service_healthy
      db:
        condition: service_healthy
    environment:
      <<: *cenv
      ORIGIN: http://localhost:3000
      BODY_SIZE_LIMIT: Infinity
      PUBLIC_POCKETBASE_URL: http://db:8090
      PUBLIC_DISABLE_SIGNUP: "false"
      UPLOAD_FOLDER: /app/uploads
      UPLOAD_USER:
      UPLOAD_PASSWORD:
      PUBLIC_OVERPASS_API_URL: https://overpass-api.de
      PUBLIC_VALHALLA_URL: https://valhalla1.openstreetmap.de
      PUBLIC_NOMINATIM_URL: https://nominatim.openstreetmap.org
    volumes:
      - ./data/uploads:/app/uploads
      # - ./data/about.md:/app/build/client/md/about.md
    ports:
      - "3000:3000"
    networks:
      - wanderer
    restart: unless-stopped
    healthcheck:
      test: curl --fail http://localhost:3000/ || exit 1
      interval: 15s
      retries: 10
      start_period: 20s
      timeout: 10s

networks:
  wanderer:
    driver: bridge
```

## Networking

All services must be part of the same Docker network. This is handled by the default `wanderer` network in the configuration above.

Make sure to set the `ORIGIN` environment variable to the full public URL (including port) where your instance is reachable. If misconfigured, the frontend will show this error:

> Cross-site POST form submissions are forbidden

## Volumes

By default, two volumes are mounted:

- Meilisearch index data: `./data/data.ms`
- PocketBase data: `./data/pb_data`

These can be changed to bind mounts or other volume strategies if needed.

## Environment

The default Docker configuration defines all necessary environment variables. You can extend or override them as needed. For advanced options, refer to the [environment configuration documentation](/run/environment-configuration).

:::caution
Ensure you replace the default `MEILI_MASTER_KEY` with a strong, unique value in production environments. Also, remember to set the `POCKETBASE_ENCRYPTION_KEY` to the key you generated [before](#prerequisites).
:::

## Updating

To update your instance to the latest version:

```bash
docker compose pull
docker compose up -d
```

Always consult the [changelog](/changelog) before updating, in case of breaking changes.

## Verify the Installation

Regardless of the installation method, once everything is running you should be able to access <span class="-tracking-[0.075em]">wanderer</span> at:

```
http://localhost:3000
```

If you see the UI and no errors in the logs, you're all set!
